from rest_framework.authentication import BaseAuthentication
from user.util import token_confirm
from home.models import AxfUser


class CartAuthentication(BaseAuthentication): # 自定义认证类，需继承自BaseAuthentication类，且重写authenticate()方法
    def authenticate(self, request):
        token=request.data.get('token',None) or request.query_params.get('token',None) # 从POST请求(也包括其他非GET请求)或GET请求获取token，获取不到返回None
        try:
            id=token_confirm.check_activate_token(token)
        except Exception as e:
            # print(e)
            return None # 认证失败需返回None。不能return Response()，也不能raise APIException()(所有djangorestframework中的异常都继承自APIException类)，否则认证不通过时报错Internal Server Error，500状态码。正常认证不通过时浏览器console报403Forbidden(针对当前项目)，pycharm控制台打印Forbidden：访问的接口
        try:
            user=AxfUser.objects.get(pk=id)
        except AxfUser.DoesNotExist as e:
            # print(e)
            return None
        return (user,token) # 认证成功需返回有两个元素的元组，第一个元素需是有意义的值，第二个元素可以是任意值，使用时可以从request的auth属性中获取